
//四个选项
//一共有多少种选项分配方案
//选项ABCD加起来一共有12个

bool flag[13][13] = { false };
unordered_map<char, int> cnt;
vector<char> v;
int res = 0;
bool isSame(int pos,char ch)
{
    for (int i = 1;i < pos;++i)   //只需要遍历前面的位置，不需要遍历所有位置，在这也因为后面的位置都没有字符
    {
        if (flag[i][pos] && v[i] != ch) {
            return false;
        }
    }
    return true;
}
void dfs(int pos)
{
    if (pos > 12) {
        ++res;
        return;
    }
    for (int i = 0;i < 4;++i)
    {
        if (cnt['A' + i] <= 0 || !isSame(pos,'A' + i)) {
            continue;
        }
        v.push_back('A' + i);
        cnt['A' + i]--;
        dfs(pos + 1);
        v.pop_back();
        cnt['A' + i]++;
    }
}

int main()
{
    int a = 0, b = 0, c = 0, d = 0;
    int m = 0;
    cin >> cnt['A'] >> cnt['B'] >> cnt['C'] >> cnt['D'] >> m;
    while (m--)
    {
        int x = 0, y = 0;
        cin >> x >> y;
        flag[x][y] = flag[y][x] = true;
    }
    v.push_back(' ');
    dfs(1);
    cout << res;
    return 0;
}